CSV bestand omzetten naar generieke lijst
Home

CSV bestand omzetten naar generieke lijst

CSV bestand omzetten naar generieke lijst

Een csv (comma separated values) bestand inlezen en omzetten naar een generieke lijst van objecten.

Probleem

Gegevens kunnen manipuleren is iets wat elke programmeur moet kunnen. Het csv formaat is een algemeen bekend en gebruik formaat om gegevens van het ene naar het andere systeem over te brengen.

Als voorbeeld nemen we de postcodes van België. Je kan die gemakkelijk downloaden van de BPost website. We downloaden die Excel formaat. Zowel de Franse als de Nederlandse versie. We voegen beiden samen en exporteren het geheel als csv met het pipe '|' teken als scheidingsteken. We slaan dat op in een bestand met de naam Postcodes.csv en plaatsen dit in de map Data.

Hieronder zie je een uitreksel uit het Postcodes.csv bestand dat we op basis van de BPost Excel bestanden hebben gemaakt. Als scheidingsteken heb ik het | teken ingesteld:

1495|VILLERS-LA-VILLE|Waals-Brabant|VILLERS-LA-VILLE|Brabant Wallon
1500|HALLE|Vlaams-Brabant|HALLE|Brabant Flamand
1501|Buizingen|Vlaams-Brabant|Buizingen|Brabant Flamand
1502|Lembeek|Vlaams-Brabant|Lembeek|Brabant Flamand
1540|Herfelingen|Vlaams-Brabant|Herfelingen|Brabant Flamand
1540|HERNE|Vlaams-Brabant|HERNE|Brabant Flamand
1541|Sint-Pieters-Kapelle|Vlaams-Brabant|Sint-Pieters-Kapelle|Brabant Flamand
1547|BEVER|Vlaams-Brabant|BIÉVÈNE|Brabant Flamand
1560|HOEILAART|Vlaams-Brabant|HOEILAART|Brabant Flamand
1570|GALMAARDEN|Vlaams-Brabant|GALMAARDEN|Brabant Flamand
1570|Tollembeek|Vlaams-Brabant|Tollembeek|Brabant Flamand
1570|Vollezele|Vlaams-Brabant|Vollezele|Brabant Flamand
1600|Oudenaken|Vlaams-Brabant|Oudenaken|Brabant Flamand
1600|Sint-Laureins-Berchem|Vlaams-Brabant|Sint-Laureins-Berchem|Brabant Flamand
1600|SINT-PIETERS-LEEUW|Vlaams-Brabant|SINT-PIETERS-LEEUW|Brabant Flamand

Elke regel in het CSV bestand stemt overeen met één rij uit een tabel (relationele databanken terminologie) of één entiteit (ERD terminoglogie). Het pipe '|' teken geeft de kolommen (terminologie relationele databanken) of de attributen (ERD terminologie) aan.

Meer info over de structuur: Oefening Analyse Postcode Console.

Design

We moeten dus eerst regel per regel de tekst doorlopen en daarna elke regel opslitsen in 5 kolommen. Als splitsingsteken gebruiken we het pipe '|' teken. Elke kolom waarde moeten we tenslotte toekennen aan de eigenschappen van de Postcode klasse. Vooraleer aan de volgende regel te beginnen stoppen we het pas gemaakte Postcode object in de generieke lijst.

We gaan gelaagd werken.

BLL

De code die de gegevens als een object voorstelt stoppen we in de Business Logc Layer (BBL)

Velden

naam bereik type omschrijving
code private string de postcode
plaats private string naam van de plaats in het Nederlands
provincie private string naam van de provincie in het Nederlands
localite private string naam van de plaats in het Frans
province private string naam van de provincie in het Frans

Eigenschappen

naam bereik type omschrijving
Code public string getter en setter voor code
Plaats public string getter en setter plaats
Provincie public string getter en setter voor provincie
Localite public string getter en setter voor localite
Province public string getter en setter voor province

Oplossing

Voeg de nodige directives toe in het bestand met de naam Postcode.cs:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.IO;

We makken een klasse met de naam PostCode in de namespace DotNetCore.Learning in het bestand met de naam Postcode.cs.

namespace DotNetCore.Learning
{
    public class Postcode
    {
        private string code;

        public string Code
        {
            get { return code; }
            set { code = value; }
        }

        private string plaats;

        public string Plaats
        {
            get { return plaats; }
            set { plaats = value; }
        }

        private string provincie;

        public string Provincie
        {
            get { return provincie; }
            set { provincie = value; }
        }

        private string localite;

        public string Localite
        {
            get { return localite; }
            set { localite = value; }
        }

        private string province;

        public string Province
        {
            get { return province; }
            set { province = value; }
        }
    }
}

DAL

De code die de gegevens inleest stoppen we in de data access layer (DAL).

Methoden

naam bereik type omschrijving
ReadPostcodesFromCSVFile public string retourneert de inhoud van het CSV bestand.
GetPostcodeList public List retourneert een generieke lijst met Postcode objecten
PostcodeCsvToObject public Postcode split een lijn in kolommen en stopt de waarden in een Postcode object en retourneert tenslotte het nieuw gemaakt object
SerializeObjectToCsv public void serialiseer een object naar CSV

We voegen de volgende methoden toe aan de klasse met de naam TryOut in de namespace DotNetCore.Learning in het bestand met de naam Learning.cs.

Deze methode leest een csv bestand in het geheugen:

public static string ReadPostcodesFromCSVFile()
{
   Helpers.Tekstbestand bestand = new Helpers.Tekstbestand();
   bestand.FileName = @"Data/Postcodes.csv";
   bestand.Lees();
   return bestand.Text;
}

Deze methode maakt een lijst van een postcode-objecten:

public static List<Postcode> GetPostcodeList()
{

    string[] postcodes = ReadPostcodesFromCSVFile().Split('\n');
    List<Postcode> list = new List<Postcode>();
    foreach (string s in postcodes)
    {
        if (s.Length > 0)
        {
            list.Add(PostcodeCsvToObject(s));
        }
    }
    return list;
}

De volgende methode zet een string voorstelling van de postcodegegevens om naar een object:

public static Postcode PostcodeCsvToObject(string line)
{
    Postcode postcode = new Postcode();
    string[] values = line.Split('|');
    postcode.Code = values[0];
    postcode.Plaats = values[1];
    postcode.Provincie = values[2];
    postcode.Localite = values[3];
    postcode.Province = values[4];
    return postcode;
}

Presentation Layer

We maken een eenvoudige presentation layer voor de Console. Een methode met de naam ListPostcodes in de klasse met de naam TryOut in de namespace DotNetCore.Learning in het bestand met de naam Learning.cs.

public static void ListPostcodes(List<Postcode> list)
{
    foreach (Postcode postcode in list)
    {
        // One of the most versatile and useful additions to the C# language in version 6
        // is the null conditional operator ?.Post           
        Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}",
            postcode?.Code,
            postcode?.Plaats,
            postcode?.Provincie,
            postcode?.Localite,
            postcode?.Province);
    }
}

En probeer het voorbeeld uit in de Main methode van de Program klasse in Program.cs:

using Microsoft.Extensions.Logging;
using System;

namespace DotNetCore.Learning
{
    class Program
    {

        static void Main(string[] args)
        {
            // Lees het csv bestand in en toon ingelezen string
            Console.WriteLine(TryOut.ReadPostcodesFromCSVFile());
            // zet stringvoorstelling postcodes om in een lijst
            // van postcode-objecten en toon de lijst in de console
            TryOut.ListPostcodes(TryOut.GetPostcodeList());
            Console.ReadKey();
        }
    }
}

JI
2017-10-12 10:44:27